package org.shj.spark.core;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.storage.StorageLevel;

/**
 * 当RDD会被复用时，我们通常就要使用持久化策略
 * 1. 持久化策略默认的是MEMORY_ONLY
 * 2. 如果内存有些吃紧，可以选择MEMORY_ONLY_SER
 * 3. 当我们的数据想要做一定的容错时，可以选择使用 _2
 * 4. 如果我们的中间结果RDD计算代价比较大，可以选择MEMORY_AND_DISK
 * 
 * MEMORY_ONLY -- 存不下就不存了
 * MEMORY_AND_DISK -- 内存不够用时，存在本地磁盘
 * @author Administrator
 *
 */
public class TestStorageLevel {

	public static void main(String[] args){
		SparkConf conf = new SparkConf().setMaster("local").setAppName("TestStorage");
		JavaSparkContext ctx = new JavaSparkContext(conf);
		
		JavaRDD<String> text = ctx.textFile("");//需要一个比较大的文本，才能体现出持久化和没有持久化的区别
		
		text = text.persist(StorageLevel.MEMORY_ONLY()); //加上这一段是指进行持久化
		
		//没有持久化，第一次操作
		long start = System.currentTimeMillis();
		long count = text.count();
		long end = System.currentTimeMillis();
		System.out.println("Read: " + count + " lines. Takes: " + (end - start));
		
		//没有持久化，第二次操作 （会比第一次短，是因为第一次有一些初始化的操作）
		start = System.currentTimeMillis();
		count = text.count();
		end = System.currentTimeMillis();
		System.out.println("Read: " + count + " lines. Takes: " + (end - start));
		ctx.close();
	}
}
